home *** CD-ROM | disk | FTP | other *** search
- /* Routines to perform incremental rotations around the three axes. */
- #include <math.h>
- #include "polygon.h"
-
- /* Concatenate a rotation by Angle around the X axis to the
- transformation in XformToChange, placing the result back into
- XformToChange. */
- void AppendRotationX(Xform XformToChange, TAngle Angle)
- {
- Fixedpoint CosTemp, SinTemp;
- Fixedpoint Temp10, Temp11, Temp12, Temp20, Temp21, Temp22;
-
- /* Get the sine and cosine of the rotation angle */
- CosSin(Angle, &CosTemp, &SinTemp);
-
- /* Calculate the new values of the six affected matrix entries */
- Temp10 = FixedMul(CosTemp, XformToChange[1][0]) +
- FixedMul(-SinTemp, XformToChange[2][0]);
- Temp11 = FixedMul(CosTemp, XformToChange[1][1]) +
- FixedMul(-SinTemp, XformToChange[2][1]);
- Temp12 = FixedMul(CosTemp, XformToChange[1][2]) +
- FixedMul(-SinTemp, XformToChange[2][2]);
- Temp20 = FixedMul(SinTemp, XformToChange[1][0]) +
- FixedMul(CosTemp, XformToChange[2][0]);
- Temp21 = FixedMul(SinTemp, XformToChange[1][1]) +
- FixedMul(CosTemp, XformToChange[2][1]);
- Temp22 = FixedMul(SinTemp, XformToChange[1][2]) +
- FixedMul(CosTemp, XformToChange[2][2]);
- /* Put the results back into XformToChange */
- XformToChange[1][0] = Temp10; XformToChange[1][1] = Temp11;
- XformToChange[1][2] = Temp12; XformToChange[2][0] = Temp20;
- XformToChange[2][1] = Temp21; XformToChange[2][2] = Temp22;
- }
-
- /* Concatenate a rotation by Angle around the Y axis to the
- transformation in XformToChange, placing the result back into
- XformToChange. */
- void AppendRotationY(Xform XformToChange, TAngle Angle)
- {
- Fixedpoint CosTemp, SinTemp;
- Fixedpoint Temp00, Temp01, Temp02, Temp20, Temp21, Temp22;
-
- /* Get the sine and cosine of the rotation angle */
- CosSin(Angle, &CosTemp, &SinTemp);
-
- /* Calculate the new values of the six affected matrix entries */
- Temp00 = FixedMul(CosTemp, XformToChange[0][0]) +
- FixedMul(SinTemp, XformToChange[2][0]);
- Temp01 = FixedMul(CosTemp, XformToChange[0][1]) +
- FixedMul(SinTemp, XformToChange[2][1]);
- Temp02 = FixedMul(CosTemp, XformToChange[0][2]) +
- FixedMul(SinTemp, XformToChange[2][2]);
- Temp20 = FixedMul(-SinTemp, XformToChange[0][0]) +
- FixedMul( CosTemp, XformToChange[2][0]);
- Temp21 = FixedMul(-SinTemp, XformToChange[0][1]) +
- FixedMul(CosTemp, XformToChange[2][1]);
- Temp22 = FixedMul(-SinTemp, XformToChange[0][2]) +
- FixedMul(CosTemp, XformToChange[2][2]);
- /* Put the results back into XformToChange */
- XformToChange[0][0] = Temp00; XformToChange[0][1] = Temp01;
- XformToChange[0][2] = Temp02; XformToChange[2][0] = Temp20;
- XformToChange[2][1] = Temp21; XformToChange[2][2] = Temp22;
- }
-
- /* Concatenate a rotation by Angle around the Z axis to the
- transformation in XformToChange, placing the result back into
- XformToChange. */
- void AppendRotationZ(Xform XformToChange, TAngle Angle)
- {
- Fixedpoint CosTemp, SinTemp;
- Fixedpoint Temp00, Temp01, Temp02, Temp10, Temp11, Temp12;
-
- /* Get the sine and cosine of the rotation angle */
- CosSin(Angle, &CosTemp, &SinTemp);
-
- /* Calculate the new values of the six affected matrix entries */
- Temp00 = FixedMul(CosTemp, XformToChange[0][0]) +
- FixedMul(-SinTemp, XformToChange[1][0]);
- Temp01 = FixedMul(CosTemp, XformToChange[0][1]) +
- FixedMul(-SinTemp, XformToChange[1][1]);
- Temp02 = FixedMul(CosTemp, XformToChange[0][2]) +
- FixedMul(-SinTemp, XformToChange[1][2]);
- Temp10 = FixedMul(SinTemp, XformToChange[0][0]) +
- FixedMul(CosTemp, XformToChange[1][0]);
- Temp11 = FixedMul(SinTemp, XformToChange[0][1]) +
- FixedMul(CosTemp, XformToChange[1][1]);
- Temp12 = FixedMul(SinTemp, XformToChange[0][2]) +
- FixedMul(CosTemp, XformToChange[1][2]);
- /* Put the results back into XformToChange */
- XformToChange[0][0] = Temp00; XformToChange[0][1] = Temp01;
- XformToChange[0][2] = Temp02; XformToChange[1][0] = Temp10;
- XformToChange[1][1] = Temp11; XformToChange[1][2] = Temp12;
- }